package com.fh.common.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Qiu,Junda 
 * @date 2019年5月3日
 * @description 反射工具类
 */
public class ReflectUtils {

	/**
	 * @author Qiu,Junda
	 * @date 2019年5月3日
	 * @description 返回对象自己所有和父类所有字段
	 */
	public static List<Field> getClassAllFields(Object object){
		List<Field> fieldList = new ArrayList<>() ;
		if(object==null)
			return fieldList;
		Class tempClass = object.getClass();
		while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
		      fieldList.addAll(Arrays.asList(tempClass .getDeclaredFields()));
		      tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
		}
		return fieldList;
	}
	
	/**
	 * @author Qiu,Junda
	 * @date 2019年5月4日
	 * @description 返回对象自己的所有字段，不包含父类字段
	 */
	public static Field[] getClassOwnFields(Object object){
		return object.getClass().getDeclaredFields();
	}
	
	/**
	 * @author Qiu,Junda
	 * @date 2019年5月4日
	 * @description 根据字段注解获取所有字段
	 * @param object
	 * @param annotationClass
	 * @return
	 */
	public static List<Field> getClassFieldsByAnnotation(Object object,Class annotationClass) {
		List<Field> returnFields=new ArrayList<Field>();
		List<Field> allFields=getClassAllFields(object);
		for (Field field : allFields) {
			if(field.getDeclaredAnnotation(annotationClass)!=null) {
				returnFields.add(field);
			}
		}
		return returnFields;
	}
	
	/**
	 * @author Qiu,Junda
	 * @date 2019年5月6日
	 * @description 通过fieldName查找对象字段，并会递归查找父类
	 * @param fieldName
	 */
	public static Field getClassFieldByName(Class classz,String fieldName)  {
		if(classz==null) {
			return null;
		}
		try {
			Field field=classz.getDeclaredField(fieldName);
			return field;
		} catch (Exception e) {
			return getClassFieldByName(classz.getSuperclass(), fieldName);
		}
		
	}
	
}
